package cn.lysoy.demo.annotation;

import cn.lysoy.demo.constant.LimitTypeEnum;

import java.lang.annotation.*;

/**
 * @author SongYang
 */
@Inherited
@Documented
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
    // redis key之间的分隔符
    String separator() default ":";
    // 资源名称，用于描述接口功能
    String name() default "";
    // 限制类型为KEY时，根据key名作限制
    String key() default "key";
    // key 前缀
    String prefix() default "limit";
    // 限制时间，单位:秒
    int period() default 60;
    // 限制时间内限制访问次数
    int count() default 60;
    // 是否根据会话ID作区分
    boolean sessionId() default false;
    // 限制类型
    LimitTypeEnum limitType() default LimitTypeEnum.IP;

    /**
     * 使用实例：
     * 测试限流注解，下面配置说明该接口 60秒内最多只能访问 10次，保存到redis的键名为 limit:test，
     * 即 prefix + ":" + key，也可以根据 IP 来限流，需指定limitType = LimitType.IP
     */
//    @AccessLimit(key = "test", period = 60, count = 10, name = "resource", prefix = "limit")
//    @GetMapping("/test")
//    public int testLimiter() {
//        return ATOMIC_INTEGER.incrementAndGet();
//    }

}
